﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Linq;
using Project.Model;
using Eco.Handles;
using IDEDialogs;
using IDE;
using Eco.Services;
using PlantControlExplorer;
using CommonClasses.Logger;
using CommonClasses.Model;
using EcoExtensions.Model;
using CommonClasses.Utility;
using Descriptions_DomainModel.Model;
using RunTime;
using Eco.ObjectRepresentation;
using CommonClasses;
using CommonClasses.Services;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace IHMainApp
{
    public partial class MainForm : Form
    {
        #region Значения из конфига

        /// <summary>
        /// Путь до конфига плагинов
        /// </summary>
        public static string factoriesCFGFile = Properties.Settings.Default.FactoriesCFGFile.ToString();

        /// <summary>
        /// Путь до папки с пользовательскими проектами
        /// </summary>
        public static string defaulUserProjectDirectory = Properties.Settings.Default.DefaulUserProjectDirectory.ToString();

        /// <summary>
        /// Путь до папки с описаниями оборудования
        /// </summary>
        public static string defaulDomainModelsDirectory = Properties.Settings.Default.DefaulDomainModelsDirectory.ToString();

        /// <summary>
        /// Путь до загружаемого с программой описания оборудования
        /// </summary>
        public static string domainModelCFGPath = Properties.Settings.Default.DomainModelCFGPath.ToString();
        #endregion


        /// <summary>
        /// Менеджер проектов
        /// </summary>
        private ProjectManager projectManager = null;

        /// <summary>
        /// Менеджер исполнения программы
        /// </summary>
        private RunTimeManager runTimeManager = null;


        /// <summary>
        /// Служебное поле : среда ECO
        /// </summary>
        private IDEEcoSpace ecoSpace;


        /// <summary>
        /// Менеджмент логов
        /// </summary>
        private ILoggingManagement loggingManagment;

        /// <summary>
        /// Логгер
        /// </summary>
        private ILogger logger = null;


        /// <summary>
        /// Картинки play и pause
        /// </summary>
        /// <remarks>
        /// [0] - play
        /// [1] - pause
        /// </remarks>
        private List<Image> playPauseImages = new List<Image>();

        /// <summary>
        /// Выбранный тип установки
        /// </summary>
        private BenchType choosenBenchType = BenchType.Virtual;

        /// <summary>
        /// Высота editorsTab перед запуском
        /// </summary>
        private int splitter5DistanceBeforeRun = 0;

        /// <summary>
        /// Последний загруженный тип проекта, определяющий текущий вариант визуальный компонентов
        /// </summary>
        private ProjectType curProjectType;


        /// <summary>
        /// Состяние исполнения
        /// </summary>
        private StateType stateF = StateType.Stop;

        /// <summary>
        /// Состяние исполнения
        /// </summary>
        private StateType state
        {
            get { return stateF; }
            set
            {
                switch (value)
                {
                    case StateType.Run:
                        if (state == StateType.Pause)
                        {
                            btnPlayPause.Image = playPauseImages[1];
                            btnPlayPause.ToolTipText = "Приостановить исполнение";
                            runTimeManager.PlayPause();
                            Console.WriteLine("IDE.RunContinue");
                        }
                        else
                        {
                            var compilationData = CompileProjectBeforeRun();
                            if (compilationData != null)
                            {
                                Console.WriteLine("IDE.Run");
                                btnPlayPause.Image = playPauseImages[1];
                                btnPlayPause.ToolTipText = "Приостановить исполнение";


                                splitter5DistanceBeforeRun = splitContainer5.SplitterDistance;
                                splitContainer5.SplitterDistance = splitContainer5.Height / 2;
                                if (tcAxiom_Errors.SelectedTab != tpAxiomControl)
                                    tcAxiom_Errors.SelectTab(tpAxiomControl);
                                MainMenuStrip.Select();
                                //MainAxiomWindow.Select();
                                tcAxiom_Errors.Enabled = false;

                                stateF = value;
                                runTimeManager.Run(choosenBenchType, compilationData);
                            }
                            else
                            {
                                ecoSpace.GetEcoService<IFunctionManager>().ClearLibrary();
                                logger.WriteMessage(MessagePriority.Warning, "Программа пуста");
                            }
                        }
                        break;

                    case StateType.Pause:
                        stateF = value;
                        runTimeManager.PlayPause();
                        btnPlayPause.Image = playPauseImages[0];
                        btnPlayPause.ToolTipText = "Возобновить исполнение";
                        Console.WriteLine("IDE.Pause");
                        break;

                    case StateType.Stop:
                        Console.WriteLine("IDE.Stop");
                        ecoSpace.GetEcoService<IFunctionManager>().ClearLibrary();
                        stateF = value;
                        runTimeManager.Stop();
                        //MainAxiomWindow.Show();
                        //MainAxiomWindow.SendToBack();
                        if (splitter5DistanceBeforeRun != 0)
                            splitContainer5.SplitterDistance = splitter5DistanceBeforeRun;
                        tcAxiom_Errors.Enabled = true;
                        //errorList.BringToFront();
                        //errorList.Show();

                        btnPlayPause.Image = playPauseImages[0];
                        btnPlayPause.ToolTipText = "Выполнить программу";
                        break;
                }
                SetMenuItemsEnabled();
            }
        }

        /// <summary>
        /// Окно, реализующее Списки Команд 
        /// </summary>
        private CommandLists.CommandListsForm commandListsForm;

        /// <summary>
        /// Конфиг IDE
        /// </summary>
        private IDEConfig config;
         
        /// <summary>
        /// Происходит ли в даный момент загрузка проекта
        /// </summary>
        private bool loadingProject = false;

        /// <summary>
        /// На какой тип проекта расчитаны текущие контролы
        /// </summary>
        private ProjectType projectTypeView;

        /// <summary>
        /// Семафор для реализации запрета двойного запуска
        /// </summary>
        private Semaphore s;

        /// <summary>
        /// Обновить список недавних проектов
        /// </summary>
        /// <remarks>стоит ли проверять наличие файла на диске</remarks>
        public void UpdateRecentPrjList(bool checkExist)
        {
            recentToolStripMenuItem.DropDownItems.Clear();
            List<string> badItems = new List<string>();
            foreach (var prjPath in config.resentProjects)
            {
                if ((!checkExist)||(File.Exists(prjPath)))
                {
                    //var item = new ToolStripMenuItem(prjPath);
                    //item.Click += new EventHandler(recentPrjItem_Click);
                    recentToolStripMenuItem.DropDownItems.Add(prjPath, null, recentPrjItem_Click);
                }
                else badItems.Add(prjPath);
            }

            badItems.ForEach(item => config.resentProjects.Remove(item));
        }

        /// <summary>
        /// Нажатие на элемент недавнего проекта
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void recentPrjItem_Click(object sender, EventArgs e)
        {
            if (!BeforeClosingQuery()) return;

            OnProjectClosed();

            LoadProject((sender as ToolStripMenuItem).Text);
        }


        /// <summary>
        /// Коструктор главного окна IDE для дизайнера
        /// </summary>
        public MainForm()
        {
            //this.serviceProvider = null;
            InitializeComponent();
            //InitializeLogger();

            /*
            // фокус переводим на меню, чтобы он на сплиттере не оставался, а то как баг выглядит
            this.menuStripMain.Select();

            // вешаем обработчики на события на дереве проекта
            this.plantControlExplorer.ProjectItemLeftClickEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemLeftClick(plantControlExplorer_ProjectItemLeftClickevent);
            this.plantControlExplorer.ProjectItemRightClickEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemRightClick(plantControlExplorer_ProjectItemRightClickEvent);
            this.plantControlExplorer.ProjectItemDoubleClickEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemDoubleClick(plantControlExplorer_PrjTreeItemDoubleClickEvent);
            this.plantControlExplorer.ProjectItemValueChangedEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemValueChanged(plantControlExplorer_ProjectItemValueChangedEvent);
            this.plantControlExplorer.ProjectItemValueRequestedEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemValueRequested(plantControlExplorer_ProjectItemValueRequestedEvent);
            this.plantControlExplorer.ProjectItemsDragDroppedEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemsDragDropped(plantControlExplorer_ProjectItemsDragDroppedEvent);

            // вешаем обработчики на события на дереве описания оборудования
            this.plantControlExplorer.DmlItemValueChangedEvent += new PlantControlExplorer.PlantControlExplorer.tDmlItemValueChanged(plantControlExplorer_DmlItemValueChangedEvent);
            this.plantControlExplorer.DmlItemValueRequestedEvent += new PlantControlExplorer.PlantControlExplorer.tDmlItemValueRequested(plantControlExplorer_DmlItemValueRequestedEvent);

            this.errorList.ErrorSelectedEvent += new ErrList.ErrList.ErrorSelectedHandler(errList_ErrorSelectedEvent);

            projectManager = ProjectManager.GetProjectManager(serviceProvider);
            projectManager.SetLoggingManagment(loggingManagment);
            projectManager.LoadFactories(factoriesCFGFile);
            projectManager.ProjectDataChangedEvent += new ProjectData.ProjectDataChangedHandler(ProjectData_ProjectDataChanged);

            // для каждого типа документа создаем свой MenuItem, чтобы пользователь выбирал
            foreach (var doctype in projectManager.DocumentTypes)
            {
                ToolStripItem tsi = new ToolStripMenuItem(doctype.Name);
                tsi.Tag = doctype;
                tsi.Click += new EventHandler(AddNewDocument_Click);
                addNewFileToPrjStripMenuItem.DropDownItems.Add(tsi);
            }

            SetMenuItemsEnabled();
             */
        }

        
        /// <summary>
        /// Коструктор главного окна IDE
        /// </summary>
        /// <param name="ecoSpace">(IDEEcoSpace)служебное поле среды ECO</param>
        /// <param name="loggingManagment">менеджмент логов</param>
        public MainForm(IDEEcoSpace ecoSpace, ILoggingManagement loggingManagment)
        {
            //Application.AddMessageFilter(splashFilter);

            this.ecoSpace = ecoSpace;
            this.loggingManagment = loggingManagment;
            InitializeComponent();

            InitializeLogger();

            try
            {
                PathUtility.RestoreCurrentDirectory(Locality.ExeFile);
                config = SerializationUtility.DeserializeFromFile<IDEConfig>(IHMainApp.Properties.Settings.Default.ConfigPath);
            }
            catch (Exception e)
            {
                logger.WriteException(e);
                ErrorsUtility.Error("Ошибка открытия конфига приложения", logger);
                config = new IDEConfig();
                config.resentProjects = new List<string>();
            }
            UpdateRecentPrjList(true);

            // фокус переводим на меню, чтобы он на сплиттере не оставался, а то как баг выглядит
            this.menuStripMain.Select();

            // вешаем обработчики на события на дереве проекта
            this.plantControlExplorer.ProjectItemLeftClickEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemLeftClick(plantControlExplorer_ProjectItemLeftClickevent);
            this.plantControlExplorer.ProjectItemRightClickEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemRightClick(plantControlExplorer_ProjectItemRightClickEvent);
            this.plantControlExplorer.ProjectItemDoubleClickEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemDoubleClick(plantControlExplorer_PrjTreeItemDoubleClickEvent);
            this.plantControlExplorer.ProjectItemValueChangedEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemValueChanged(plantControlExplorer_ProjectItemValueChangedEvent);
            this.plantControlExplorer.ProjectItemValueRequestedEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemValueRequested(plantControlExplorer_ProjectItemValueRequestedEvent);
            this.plantControlExplorer.ProjectItemsDragDroppedEvent += new PlantControlExplorer.PlantControlExplorer.tProjectItemsDragDropped(plantControlExplorer_ProjectItemsDragDroppedEvent);

            // вешаем обработчики на события на дереве описания оборудования
            // не вещаем потому что комплилируемость узлов не реализована, а комментарии менять не надо, а если надо, то в редакторе оборудования
            //this.plantControlExplorer.DmlItemValueChangedEvent += new PlantControlExplorer.PlantControlExplorer.tDmlItemValueChanged(plantControlExplorer_DmlItemValueChangedEvent);
            //this.plantControlExplorer.DmlItemValueRequestedEvent += new PlantControlExplorer.PlantControlExplorer.tDmlItemValueRequested(plantControlExplorer_DmlItemValueRequestedEvent);

            this.errorList.ErrorSelectedEvent += new ErrList.ErrList.ErrorSelectedHandler(errList_ErrorSelectedEvent);

            projectManager = ProjectManager.GetProjectManager(ecoSpace);
            projectManager.SetLoggingManagment(loggingManagment);
            projectManager.LoadFactories(factoriesCFGFile);
            projectManager.ProjectDataChangedEvent += new ProjectData.ProjectDataChangedHandler(ProjectData_ProjectDataChanged);
            //projectManager.LoadDomainModels(IHMainApp.Properties.Settings.Default.EmptyDMPath);
            
            PathUtility.SetCurrentProjectPath(IHMainApp.Properties.Settings.Default.DefaulUserProjectDirectory);

            // для каждого типа документа создаем свой MenuItem, чтобы пользователь выбирал
            foreach (var doctype in projectManager.DocumentTypes)
            {
                ToolStripItem tsi = new ToolStripMenuItem(doctype.Name);
                tsi.Tag = doctype;
                tsi.Click += new EventHandler(AddNewDocument_Click);
                addNewFileToPrjStripMenuItem.DropDownItems.Add(tsi);
            }

            cbBenchType.SelectedIndex = 0;

            playPauseImages.Add(Properties.Resources.Play);
            playPauseImages.Add(Properties.Resources.Pause);

            PathUtility.SetCurrentProjectPath(null);
            projectManager.LoadDeviceDescriptions(domainModelCFGPath);

            //для литья
            //projectManager.LoadDomainModels(IHMainApp.Properties.Settings.Default.MILPDMPath);

            //для станков
            //projectManager.LoadDomainModels(IHMainApp.Properties.Settings.Default.RMSIDMPath);
            
            runTimeManager = RunTimeManager.GetRunTimeManager(ecoSpace, loggingManagment, MainAxiomWindow);
            runTimeManager.FinishedEvent += new RunTimeManager.RunTimeFinshedEventHandler(runTimeManager_FinishedEvent);

            state = StateType.Stop;

            var commandLine = Environment.CommandLine;
            // если приложение загружается под заданный проект
            if (commandLine.Contains("\\open "))
            {
                var index = commandLine.LastIndexOf("\\open ");
                var filename = commandLine.Substring(index + 7, commandLine.Length - (index + 8));
                Console.WriteLine("Opening project at path: " + filename);
                logger.WriteMessage(MessagePriority.Info, "Opening project at path: " + filename);
                OnProjectClosed();
                LoadProject(filename);
            }
            else
            {// если приложение запускается впустую
               
                /*if (config.ProjectTypeView == ProjectType.CommandList)
                {
                    //для литья
                    projectManager.LoadDomainModels(IHMainApp.Properties.Settings.Default.MILPDMPath);
                    ArrangeCommandListViewComponents();
                }
                else if (config.ProjectTypeView == ProjectType.Usual)
                {
                    //для станков
                    projectManager.LoadDomainModels(IHMainApp.Properties.Settings.Default.RMSIDMPath);
                } 
                projectTypeView = config.ProjectTypeView;
                 */
                projectTypeView = ProjectType.Usual;
            }

            SetMenuItemsEnabled();

            s = new System.Threading.Semaphore(0, 1, "IH_SEMAPHORE");
            s.Release();
        }


        #region errorList event handlers

        /// <summary>
        /// Обработчик на выбор ошибки
        /// </summary>
        /// <param name="error">ошибка</param>
        private void errList_ErrorSelectedEvent(Error error)
        {
            if (error.CompilationUnit != null)
            {
                IDocumentEditor editor = error.CompilationUnit.GetEditorAtPoint(error.Point);
                var doc = projectManager.GetDocByEditor(editor);
                if (doc != null)
                {
                    SelectDocPage(doc);
                    editor.ShowError(error);
                }
            }
        }

        #endregion


        #region plantControlExplorer event handlers


        #region ContextMenu's event handlers

        private void menu_VirtFolderItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            switch (e.ClickedItem.Text)
            {
                case "Добавить новый раздел":
                    (sender as ContextMenuStrip).Hide();
                    object objectSender = ((sender as ContextMenuStrip).Tag as TreeNode).Tag;
                    if (objectSender is ProjectData)
                        projectManager.AddNewVirtFolder(projectManager.ProjectData.ProjectFolder, "Новый раздел");
                    projectManager.AddNewVirtFolder(objectSender as VirtFolder, "Новый раздел");
                    break;

                case "Добавить файл":
                    (sender as ContextMenuStrip).Hide();
                    AddExistFile_Click(null, null);
                    break;

                case "Удалить":
                    (sender as ContextMenuStrip).Hide();
                    projectManager.DeleteVirtFolder(((sender as ContextMenuStrip).Tag as TreeNode).Tag as VirtFolder);
                    break;

            }
        }

        private void menu_DocumentInfoItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            (sender as ContextMenuStrip).Hide();
            switch (e.ClickedItem.Text)
            {
                case "Сохранить как...":
                    var doc = ((sender as ContextMenuStrip).Tag as TreeNode).Tag as DocumentInfo;
                    SaveAsDocument(doc);
                    break;

                case "Исключить из проекта":
                    doc = ((sender as ContextMenuStrip).Tag as TreeNode).Tag as DocumentInfo;
                    RemoveDocumentPage(doc);
                    projectManager.RemoveDocument(doc);
                    break;

                case "Редактировать":
                    doc = ((sender as ContextMenuStrip).Tag as TreeNode).Tag as DocumentInfo;
                    if (doc != null)
                    {
                        SelectDocPage(doc);
                    }

                    break;

                case "Удалить":
                    doc = ((sender as ContextMenuStrip).Tag as TreeNode).Tag as DocumentInfo;
                    var res = MessageBox.Show("Исключить документ из проекта и удалить его файл с диска?", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (res == DialogResult.OK)
                    {
                        RemoveDocumentPage(doc);
                        projectManager.DeleteDocument(doc);
                    }
                    break;
            }
        }

        #endregion

        /// <summary>
        /// Обработчик на левый клик по элементу структуры в структуре проекта
        /// </summary>
        /// <param name="item">элемент дерева проекта</param>
        private void plantControlExplorer_ProjectItemLeftClickevent(object item)
        {
            if (item is IDocStructElement)
            {
                IDocStructElement elem = item as IDocStructElement;
                elem.OnSelect();

            }
        }

        /// <summary>
        /// Обработчик на правый клик по элементу структуры в структуре проекта
        /// </summary>
        /// <param nam="item">элемент дерева проекта</param>
        /// <param name="treeNode">узел на дереве проекта, соответствующий объекту</param>
        /// <param name="location">координаты щелчка на экране</param>
        /// 
        private void plantControlExplorer_ProjectItemRightClickEvent(object item, TreeNode treeNode, Point location)
        {
            if ((item is ProjectData) || (item is VirtFolder))
            {
                var menu = new ContextMenuStrip();
                menu.Tag = treeNode; // menu.Tag будет хранить узел дерева, для которого менюшка вызвана
                menu.Items.Add("Добавить новый раздел");

                var addNewFileToPrjStripMenuItem2 = new ToolStripMenuItem(addNewFileToPrjStripMenuItem.Text);

                // для каждого типа документа создаем свой MenuItem, чтобы пользователь выбирал
                foreach (var doctype in projectManager.DocumentTypes)
                {
                    ToolStripItem tsi = new ToolStripMenuItem(doctype.Name);
                    tsi.Text = doctype.Name;

                    List<object> tag = new List<object>();
                    tag.Add(doctype);
                    tag.Add(item);
                    tsi.Tag = tag;

                    tsi.Click += new EventHandler(AddNewDocument_Click_Context);
                    addNewFileToPrjStripMenuItem2.DropDownItems.Add(tsi);
                }

                menu.Items.Add(addNewFileToPrjStripMenuItem2);

                var addExistFileToPrjStripMenuItem2 = new ToolStripMenuItem(addExistFileToPrjStripMenuItem.Text);
                addExistFileToPrjStripMenuItem2.Tag = item;
                addExistFileToPrjStripMenuItem2.Click += new EventHandler(AddExistFile_Click_Context);
                menu.Items.Add(addExistFileToPrjStripMenuItem2);
                if (!(item is ProjectData))
                    menu.Items.Add("Удалить");
                menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_VirtFolderItemClicked);
                menu.Show(new Point(location.X + 10, location.Y + 50));
            }
            else if (item is DocumentInfo)
            {
                var menu = new ContextMenuStrip();
                menu.Tag = treeNode; // menu.Tag будет хранить узел дерева, для которого менюшка вызвана
                menu.Items.Add("Редактировать");
                menu.Items.Add("Сохранить как...");
                menu.Items.Add("Исключить из проекта");
                menu.Items.Add("Удалить");
                menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_DocumentInfoItemClicked);
                menu.Show(new Point(location.X + 10, location.Y + 50));
            }
            else if (item is IDocStructElement)
            {
                var menu = ((item as IDocStructElement).ParentDocEditor as IDocumentEditor).GetDocElemMenu(item as IDocStructElement);
                menu.Show(new Point(location.X + 10, location.Y + 50));
            }
        }

        /// <summary>
        /// Обработчик на двойной клик по элементу структуры в структуре проекта
        /// </summary>
        /// <param name="item">элемент</param>
        private void plantControlExplorer_PrjTreeItemDoubleClickEvent(object item)
        {
            TreeNode node = item as TreeNode;
            if (node.Tag is DocumentInfo)
            {
                SelectDocPage(node.Tag as DocumentInfo);
            }
        }

        /// <summary>
        /// Запрос какого-либо значения для объекта описания оборудования
        /// </summary>
        /// <param name="item">элемент</param>
        /// <param name="code">параметр элемента</param>
        /// <returns>возвращаемое значение</returns>
        ///
        private object plantControlExplorer_DmlItemValueRequestedEvent(object item, PlantControlExplorer.DmlEventCode code)
        {
            switch (code)
            {
                case DmlEventCode.IsCompiled:
                    {
                        if (item is Node)
                        {
                            Node node = item as Node;
                            return projectManager.IsNodeCompiled(node);
                        }
                        else if (item is NodeGroup)
                        {
                            NodeGroup nodeGroup = item as NodeGroup;
                            return projectManager.IsNodeGroupCompiled(nodeGroup);
                        }
                    }
                    break;

                case DmlEventCode.Comments:
                    {
                        if (item is Node)
                        {
                            Node node = item as Node;
                            return node.Comments;
                        }
                        else if (item is NodeGroup)
                        {
                            NodeGroup nodeGroup = item as NodeGroup;
                            return nodeGroup.Comments;
                        }
                    }
                    break;
            }
            return null;
        }

        /// <summary>
        /// Обрабочик изменения какого-либо значения в объекте описания оборудования
        /// </summary>
        /// <param name="item">элемент</param>
        /// <param name="code">параметр элемента</param>
        /// <param name="newValue">новое значение</param>
        ///
        private void plantControlExplorer_DmlItemValueChangedEvent(object item, PlantControlExplorer.DmlEventCode code, object newValue)
        {
            switch (code)
            {
                case DmlEventCode.IsCompiled:

                    if (item is Node)
                    {
                        Node node = item as Node;
                        projectManager.ChangeNodeIsCompiled(node, (bool)newValue);
                    }
                    else if (item is NodeGroup)
                    {
                        NodeGroup nodeGroup = item as NodeGroup;
                        projectManager.ChangeNodeGroupIsCompiled(nodeGroup, (bool)newValue);
                    }

                    break;

                case DmlEventCode.Comments:
                    if (item is Node)
                        (item as Node).Comments = (string)newValue;
                    else if (item is NodeGroup)
                        (item as NodeGroup).Comments = (string)newValue;
                    else if (item is Method)
                        (item as Method).Comments = (string)newValue;
                    else if (item is NamedState)
                        (item as NamedState).Comments = (string)newValue;

                    ProjectData_ProjectDataChanged(ProjectData.ProjectDataChangedCode.DMComments, null);
                    break;
            }
        }

        /// <summary>
        /// Запрос какого-либо значения для объекта структуры проекта
        /// </summary>
        /// <param name="item">элемент</param>
        /// <param name="code">параметр элемента</param>
        /// <returns>возвращаемое значение</returns>
        ///
        private object plantControlExplorer_ProjectItemValueRequestedEvent(object item, PlantControlExplorer.ProjectEventCode code)
        {
            switch (code)
            {
                case ProjectEventCode.IsDocCompiled:
                    DocumentInfo doc = item as DocumentInfo;
                    return (doc.Editor.Object as IDocumentEditor).IsCompiled;

                case ProjectEventCode.DocName:
                    doc = item as DocumentInfo;
                    return Path.GetFileNameWithoutExtension(doc.DocumentPath);

                case ProjectEventCode.ProjectPath:
                    return projectManager.ProjectDataPath;

            }
            return null;
        }

        /// <summary>
        /// Обрабочик изменения какого-либо значения в объекте структуры проекта
        /// </summary>
        /// <param name="item">элемент</param>
        /// <param name="code">параметр элемента</param>
        /// <param name="newValue">новое значение</param>
        /// 
        private void plantControlExplorer_ProjectItemValueChangedEvent(object item, PlantControlExplorer.ProjectEventCode code, object newValue)
        {
            switch (code)
            {
                case ProjectEventCode.IsDocCompiled:
                    DocumentInfo doc = item as DocumentInfo;
                    (doc.Editor.Object as IDocumentEditor).IsCompiled = (bool)newValue;
                    break;

                case ProjectEventCode.DocName:
                    doc = item as DocumentInfo;
                    string newDocName = (string)newValue;

                    int index = newDocName.IndexOfAny(Path.GetInvalidFileNameChars());

                    if (index != -1)
                    {
                        char invLet = newDocName[index];

                        ErrorsUtility.Error("Название документа '" + newDocName + "' не может содержать символ '"
                        + invLet + "'. Выберите другое название. ", logger);

                        return;
                    }

                    if (newDocName == "")
                    {
                        ErrorsUtility.Error("Название документа '" + newDocName + "' не может быть пустым. Выберите другое название. ", logger);
                        return;
                    }

                    if (!DublicateDocName(doc, newDocName))
                        doc.DocumentPath = PathUtility.ChangeFileName(doc.DocumentPath, newDocName);
                    else ErrorsUtility.Error("Дoкумент c именем " + newDocName + " уже есть в проекте. " +
                                            "Измените имя документа", logger);


                    break;

                case ProjectEventCode.DocElName:
                    var docElem = item as IDocStructElement;
                    docElem.Name = (string)newValue;
                    ProjectData_ProjectDataChanged(ProjectData.ProjectDataChangedCode.Structure, null);
                    break;

                case ProjectEventCode.ProjectName:
                    string newName = (string)newValue;
                    index = newName.IndexOfAny(Path.GetInvalidFileNameChars());
                    if (index != -1)
                    {
                        char invLet = newName[index];
                        ErrorsUtility.Error("Название проекта '" + newName + "' не может содержать символ '"
                           + invLet + "'. Выберите другое название. ", logger);
                        return;
                    }
                    if (newName == "")
                    {
                        ErrorsUtility.Error("Название проекта '" + newName + "' не может быть пустым. Выберите другое имя. ", logger);
                        return;
                    }
                    projectManager.ProjectData.Name = newName;
                    break;
                case ProjectEventCode.VirtFoldName:

                    newName = (string)newValue;

                    if (newName == "")
                    {
                        ErrorsUtility.Error("Название папки '" + newName + "' не может быть пустым. Выберите другое имя. ", logger);
                        return;
                    }
                    (item as VirtFolder).Name = newName;
                    break;
            }
        }

        /// <summary>
        /// Обработчик события: перетащить одни элементы в другой
        /// </summary>
        /// <param name="items">элементы</param>
        /// <param name="targetItem">элемент, в который перетаскиваются</param>
        private void plantControlExplorer_ProjectItemsDragDroppedEvent(List<object> items, object targetItem)
        {
            var edocs = from di in items
                        where (di is DocumentInfo)
                        select (di as DocumentInfo);
            var efolders = from fold in items
                           where (fold is VirtFolder)
                           select (fold as VirtFolder);
            var docs = edocs.ToList<DocumentInfo>();
            var folders = efolders.ToList<VirtFolder>();

            projectManager.MoveDocumentsTo(docs, targetItem as VirtFolder);
            projectManager.MoveFoldersTo(folders, targetItem as VirtFolder);
        }

        #endregion


        #region commandListsForm event handlers

        /// <summary>
        /// Обработчик изменения в списках команд пути до файла с загруженной программой
        /// </summary>
        /// <param name="newFileName">новый путь</param>
        private void commandListsForm_FileNameChangedEvent(string newFileName)
        {
            projectManager.ProjectData.Tag = new EcoObject(ecoSpace, newFileName);
        }

        #endregion


        /// <summary>
        /// Изменилось название проекта
        /// (изменится название проекта и соответствующее ему название файла,
        /// удалятся файлы для проекта со старым названием)
        /// </summary>
        /// <param name="OldName">Старое название</param>
        private void ProjectData_NameChanged(string OldName)
        {
            string newName = projectManager.ProjectData.Name;
            if (OldName != null)
            {
                PathUtility.RestoreCurrentDirectory(Locality.CurrentProjectDir);
                if ((File.Exists(newName + ".ihprj")) || (File.Exists(newName + ".ihprj.folders")))
                {
                    var res = MessageBox.Show("В директории проекта уже имеется файл проекта с именем " + newName + ". Заменить этот файл?", "Запрос на замену файла на диске", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (res != DialogResult.OK)
                        return;
                }

                if (File.Exists(OldName + ".ihprj"))
                {
                    File.Delete(OldName + ".ihprj");
                }
                if (File.Exists(OldName + ".ihprj.folders"))
                {
                    File.Delete(OldName + ".ihprj.folders");
                }

                if (projectManager.ProjectData.ProjectFolder.Name != projectManager.ProjectData.Name)
                    projectManager.ProjectData.ProjectFolder.Name = projectManager.ProjectData.Name;
                projectManager.SaveProject();
            }
        }


        /// <summary>
        /// Обработчик события "Изменение данных проекта"
        /// </summary>
        /// <param name="code">код изменения</param>
        /// <param name="extraInfo">дополнительная информация</param>
        private void ProjectData_ProjectDataChanged(ProjectData.ProjectDataChangedCode code, object extraInfo)
        {
            bool filltreeView = true;
            switch (code)
            {
                case ProjectData.ProjectDataChangedCode.DocIsDirty:
                    TabPage page = (extraInfo as DocumentInfo).TabPage.Page as TabPage;
                    if ((extraInfo as DocumentInfo).IsDirty)
                    {
                        if (!page.Text.EndsWith("*"))
                            page.Text = page.Text.Insert(page.Text.Length, "*");
                    }
                    else if (page.Text.EndsWith("*"))
                        page.Text = page.Text.Remove(page.Text.Length - 1, 1);
                    filltreeView = false;
                    break;

                case ProjectData.ProjectDataChangedCode.DocStructure:
                    projectManager.ProjectData.IsDirty = true;
                    break;

                case ProjectData.ProjectDataChangedCode.ProjectName:
                    ProjectData_NameChanged((string)extraInfo);
                    break;

                case ProjectData.ProjectDataChangedCode.ProjectFolderName:
                    projectManager.ProjectData.Name = (extraInfo as VirtFolder).Name;
                    break;
                case ProjectData.ProjectDataChangedCode.Structure:
                    projectManager.ProjectData.IsDirty = true;
                    break;

                case ProjectData.ProjectDataChangedCode.All:
                    projectManager.ProjectData.IsDirty = true;
                    break;
                /*
                case ProjectData.ProjectDataChangedCode.DMComments:
                    filltreeView = false;
                    projectManager.ProjectData.IsDirty = true;
                    break;
                 */ 

                case ProjectData.ProjectDataChangedCode.Tag:
                    projectManager.ProjectData.IsDirty = true;
                    break;
                case ProjectData.ProjectDataChangedCode.IsDirty:
                    filltreeView = false;
                    break;
            }

            if (projectManager.ProjectData.ProjectType == ProjectType.Usual)
                this.Text = "IronHand IDE" + " - " + projectManager.ProjectData.Name + (projectManager.ProjectData.IsDirty ? "*" : "");
            else if (projectManager.ProjectData.ProjectType == ProjectType.CommandList)
                this.Text = "IronHand IDE" + " - " + projectManager.ProjectData.Name + (projectManager.ProjectData.IsDirty ? "*" : "")
                    /* + имя программы СК (projectManager.ProjectData.Tag != null ? (" - [" + Path.GetFileNameWithoutExtension((string)projectManager.ProjectData.Tag.Object) + "]") : "")*/
                                                                                                                                                                                       ;

            if (projectManager.ProjectData.ProjectType == ProjectType.Usual)
            {
                if (filltreeView)
                    fillPlantControlExplorer();
                SetMenuItemsEnabled();

            }
        }


        /// <summary>
        /// Обработчик события завершения исполнения программы
        /// </summary>
        /// <param name="runFinishedState">результат исполнения</param>
        private void runTimeManager_FinishedEvent(RunTimeManager.RunFinshedState runFinishedState)
        {
            if (runFinishedState == RunTimeManager.RunFinshedState.ErrorConnecting)
                ErrorsUtility.Error("Устройство не подключено.\nДоступен только режим моделирования.", logger);
            else MessageBox.Show("Исполнение программы завершено", "Результат исполнения", MessageBoxButtons.OK, MessageBoxIcon.Information);
            state = StateType.Stop;
        }


        /// <summary>
        /// Обновить некоторые параметры визульных элементов интерфйса
        /// </summary>
        private void SetMenuItemsEnabled()
        {
            #region загружен в среде проект или нет
            if (projectManager.ProjectData == null)
            {
                addNewFileToPrjStripMenuItem.Enabled = false;
                addExistFileToPrjStripMenuItem.Enabled = false;
                saveAllStripMenuItem.Enabled = false;
                cbBenchType.Enabled = false;
            }
            else
            {
                addNewFileToPrjStripMenuItem.Enabled = true;
                addExistFileToPrjStripMenuItem.Enabled = true;
                saveAllStripMenuItem.Enabled = true;
                btnPlayPause.Enabled = true;
                playPauseToolStripMenuItem.Enabled = true;
                this.buildStripMenuItem.Enabled = true;
                this.addNewFileToPrjStripMenuItem.Enabled = true;
                cbBenchType.Enabled = true;
            }
            #endregion

            #region проект есть, но есть ли в нем хотя бы один документ (чтобы был один активный)
            if ((projectManager.ProjectData == null) || (ecoSpace.GetEcoService<IOclService>().Evaluate("DocumentInfo.allInstances").GetAsIList<DocumentInfo>().Count == 0))
            {
                buildStripMenuItem.Enabled = false;

                btnPlayPause.Enabled = false;
                playPauseToolStripMenuItem.Enabled = false;
                cbBenchType.Enabled = false;

                saveToolStripMenuItem.Enabled = false;
                saveAsToolStripMenuItem.Enabled = false;


                closeToolStripMenuItem.Enabled = false;
                closeAllStripMenuItem.Enabled = false;

                DelCurFileFromPrjStripMenuItem.Enabled = false;

            }
            else
            {
                buildStripMenuItem.Enabled = true;
                addNewFileToPrjStripMenuItem.Enabled = true;

                btnPlayPause.Enabled = true;
                playPauseToolStripMenuItem.Enabled = true;
                cbBenchType.Enabled = true;

                saveToolStripMenuItem.Enabled = true;
                saveAsToolStripMenuItem.Enabled = true;
                saveAllStripMenuItem.Enabled = true;

                closeToolStripMenuItem.Enabled = true;
                closeAllStripMenuItem.Enabled = true;

                DelCurFileFromPrjStripMenuItem.Enabled = true;
            }
            #endregion

            #region каков тип проекта, если проект загружен
            if (projectManager.ProjectData != null)
                switch (projectManager.ProjectData.ProjectType)
                {
                    case ProjectType.Usual:
                        {
                            plantControlExplorer.Show();
                            /*plantControlExplorer.tabControl.TabPages["ProjectExplorer"].Show();
                            plantControlExplorer.tabControl.TabPages["DomainModelExplorer"].Show();*/

                            break;
                        }
                    case ProjectType.CommandList:
                        {
                            plantControlExplorer.Hide();
                            /*plantControlExplorer.tabControl.TabPages["ProjectExplorer"].Hide();
                            plantControlExplorer.tabControl.TabPages["DomainModelExplorer"].Hide();*/

                            break;
                        }
                }

            #endregion

            #region есть ли выделенная вкладка

            if ((editorsPanel.TabPages.Count == 0) || (editorsPanel.SelectedTab == null))
            {
                closeToolStripMenuItem.Enabled = false;
                closeAllStripMenuItem.Enabled = false;
                saveToolStripMenuItem.Enabled = false;
                saveAsToolStripMenuItem.Enabled = false;
            }
            else
            {
                closeToolStripMenuItem.Enabled = true;
                closeAllStripMenuItem.Enabled = true;
                saveToolStripMenuItem.Enabled = true;
                saveAsToolStripMenuItem.Enabled = true;
            }
            #endregion

            #region а каков режим-то, а ?!!!
            if (state == StateType.Stop)
            {
                // нормальный режим

                btnStop.Enabled = false;
                stopToolStripMenuItem.Enabled = false;

                plantControlExplorer.ProjectTreeView.Enabled = true;
                plantControlExplorer.DomainModelTreeView.Enabled = true;
                plantControlExplorer.DomainModelTreeView2.Enabled = true;
                plantControlExplorer.FunctionTreeView.Enabled = true;
                editorsPanel.Enabled = true;
                errorList.Enabled = true;

                newToolStripMenuItem.Enabled = true;
                openToolStripMenuItem.Enabled = true;
                saveToolStripMenuItem.Enabled = true;
                saveAsToolStripMenuItem.Enabled = true;
                saveAllStripMenuItem.Enabled = true;
                closeToolStripMenuItem.Enabled = true;
                closeAllStripMenuItem.Enabled = true;

                buildStripMenuItem.Enabled = true;
                addExistFileToPrjStripMenuItem.Enabled = true;
                addNewFileToPrjStripMenuItem.Enabled = true;
                DelCurFileFromPrjStripMenuItem.Enabled = true;

            }
            else
            {
                // происходит выполнение, возможно приостановленное
                btnStop.Enabled = true;
                stopToolStripMenuItem.Enabled = true;
                cbBenchType.Enabled = false;

                plantControlExplorer.ProjectTreeView.Enabled = false;
                plantControlExplorer.DomainModelTreeView.Enabled = false;
                plantControlExplorer.DomainModelTreeView2.Enabled = false;
                plantControlExplorer.FunctionTreeView.Enabled = false;
                editorsPanel.Enabled = false;
                errorList.Enabled = false;

                newToolStripMenuItem.Enabled = false;
                openToolStripMenuItem.Enabled = false;
                saveToolStripMenuItem.Enabled = false;
                saveAsToolStripMenuItem.Enabled = false;
                saveAllStripMenuItem.Enabled = false;
                closeToolStripMenuItem.Enabled = false;
                closeAllStripMenuItem.Enabled = false;

                buildStripMenuItem.Enabled = false;
                addExistFileToPrjStripMenuItem.Enabled = false;
                addNewFileToPrjStripMenuItem.Enabled = false;
                DelCurFileFromPrjStripMenuItem.Enabled = false;

            }
            #endregion

            playPauseToolStripMenuItem.Image = btnPlayPause.Image;
            playPauseToolStripMenuItem.Text = btnPlayPause.ToolTipText;
            stopToolStripMenuItem.Image = btnStop.Image;

        }


        /// <summary>
        /// Добавить в проект новый файл 
        /// (обработчик контекстного меню папки)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AddNewDocument_Click_Context(object sender, EventArgs e)
        {
            ToolStripMenuItem tsi = sender as ToolStripMenuItem;
            if (tsi == null) return;

            List<object> tag = tsi.Tag as List<object>;
            var doctype = tag[0] as DocumentType;
            var parentFolder = tag[1] as VirtFolder;

            var newdoc = projectManager.AddNewDocument(doctype, parentFolder);

            TabPage tabPage = new TabPage(Path.GetFileNameWithoutExtension((newdoc.Editor.Object as IDocumentEditor).Path));
            Panel panel = new Panel();
            panel.Parent = tabPage;
            panel.BorderStyle = BorderStyle.Fixed3D;
            panel.Dock = DockStyle.Fill;
            panel.AutoScroll = true;
            tabPage.Controls.Add(panel);
            editorsPanel.TabPages.Add(tabPage);
            newdoc.TabPage = new EcoTabPage(ecoSpace);
            newdoc.TabPage.Page = tabPage;
            (newdoc.Editor.Object as IDocumentEditor).Initialize(panel);
        }


        /// <summary>
        /// Добавить в проект новый файл
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AddNewDocument_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem tsi = sender as ToolStripMenuItem;
            if (tsi == null) return;

            var doctype = tsi.Tag as DocumentType;
            //if (doctype == null) return;

            var newdoc = projectManager.AddNewDocument(doctype, null);

            TabPage tabPage = new TabPage(Path.GetFileNameWithoutExtension((newdoc.Editor.Object as IDocumentEditor).Path));
            Panel panel = new Panel();
            panel.Parent = tabPage;
            panel.BorderStyle = BorderStyle.Fixed3D;
            panel.Dock = DockStyle.Fill;
            panel.AutoScroll = true;
            tabPage.Controls.Add(panel);
            editorsPanel.TabPages.Add(tabPage);
            newdoc.TabPage = new EcoTabPage(ecoSpace);
            newdoc.TabPage.Page = tabPage;
            (newdoc.Editor.Object as IDocumentEditor).Initialize(panel);
        }


        /// <summary>
        /// Добавить в проект файл с диска
        /// (обработчик контекстного меню папки)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AddExistFile_Click_Context(object sender, EventArgs e)
        {
            ToolStripMenuItem tsi = sender as ToolStripMenuItem;
            if (tsi == null) return;

            VirtFolder folder = tsi.Tag as VirtFolder;

            // здесь запрашиваем в диалоге файл, пытаемся его открыть
            OpenFileDialog dial = new OpenFileDialog();
            dial.CheckFileExists = true;
            dial.Multiselect = false;
            string s = "";
            projectManager.DocumentTypes.ForEach(dtype => s += dtype.Name + " (*." + dtype.Extension + ")|*." + dtype.Extension + "|");
            s = s.Remove(s.Length - 1);
            dial.Filter = s;
            dial.DefaultExt = projectManager.DocumentTypes[0].Name + "(*." + projectManager.DocumentTypes[0].Extension + ")|*." + projectManager.DocumentTypes[0].Extension;
            dial.RestoreDirectory = true;
            dial.Title = "Добавить документ в проект";

            bool work = true;
            while (work)
            {
                work = true;

                DialogResult res = dial.ShowDialog();
                if (res == DialogResult.OK)
                {
                    if (DublicateDocName(null, dial.FileName))
                        ErrorsUtility.Error("Дoкумент c именем " + Path.GetFileNameWithoutExtension(dial.FileName) + " уже есть в проекте. " +
                    "Переименуйте данный файл, после чего повторите попытку", logger);
                    else
                    {
                        DocumentType doctype = projectManager.DocumentTypes[dial.FilterIndex - 1];
                        DocumentInfo newDoc = null;
                        try
                        {
                            newDoc = projectManager.AddExistingDocument(dial.FileName, folder);
                        }
                        catch (LoadingDocumentException exception)
                        {
                            logger.WriteException(exception);
                            ErrorsUtility.Error("Ошибка загрузки документа. " + exception.Message, logger);
                            MessageBox.Show("Файл " + Path.GetFullPath(dial.FileName) + " не будет добавлен в проект", "Ошибка загрузки документа", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            projectManager.RemoveDocument(newDoc);
                            return;
                        }
                        catch (FileExtensionUnknownException exception)
                        {
                            logger.WriteException(exception);
                            ErrorsUtility.Error("Ошибка загрузки документа. " + exception.Message, logger);
                            MessageBox.Show("Файл " + Path.GetFullPath(dial.FileName) + " не будет добавлен в проект", "Ошибка загрузки документа", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            projectManager.RemoveDocument(newDoc);
                            return;
                        }
                        newDoc.IsPathKnown = true;
                        CreatePageForExistingDocument(newDoc);
                        SelectDocPage(newDoc);
                        work = false;
                    }
                }
                else work = false;
            }
        }

        /// <summary>
        /// Добавить в проект файл с диска
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AddExistFile_Click(object sender, EventArgs e)
        {
            // здесь запрашиваем в диалоге файл, пытаемся его открыть
            OpenFileDialog dial = new OpenFileDialog();
            dial.CheckFileExists = true;
            dial.Multiselect = false;
            string s = "";
            projectManager.DocumentTypes.ForEach(dtype => s += dtype.Name + " (*." + dtype.Extension + ")|*." + dtype.Extension + "|");
            s = s.Remove(s.Length - 1);
            dial.Filter = s;
            dial.DefaultExt = projectManager.DocumentTypes[0].Name + "(*." + projectManager.DocumentTypes[0].Extension + ")|*." + projectManager.DocumentTypes[0].Extension;
            dial.RestoreDirectory = true;
            dial.Title = "Добавить документ в проект";

            bool work = true;
            while (work)
            {
                work = true;

                DialogResult res = dial.ShowDialog();
                if (res == DialogResult.OK)
                {
                    if (DublicateDocName(null, dial.FileName))
                        ErrorsUtility.Error("Дoкумент c именем " + Path.GetFileNameWithoutExtension(dial.FileName) + " уже есть в проекте. " +
                    "Переименуйте данный файл, после чего повторите попытку", logger);
                    else
                    {
                        DocumentType doctype = projectManager.DocumentTypes[dial.FilterIndex - 1];
                        DocumentInfo newDoc = null;
                        try
                        {
                            newDoc = projectManager.AddExistingDocument(dial.FileName, null);
                        }
                        catch (LoadingDocumentException exception)
                        {
                            logger.WriteException(exception);
                            ErrorsUtility.Error("Ошибка загрузки документа. " + exception.Message, logger);
                            MessageBox.Show("Файл " + Path.GetFullPath(dial.FileName) + " не будет добавлен в проект", "Ошибка загрузки документа", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            projectManager.RemoveDocument(newDoc);
                            return;
                        }
                        catch (FileExtensionUnknownException exception)
                        {
                            logger.WriteException(exception);
                            ErrorsUtility.Error("Ошибка загрузки документа. " + exception.Message, logger);
                            MessageBox.Show("Файл " + Path.GetFullPath(dial.FileName) + " не будет добавлен в проект", "Ошибка загрузки документа", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            projectManager.RemoveDocument(newDoc);
                            return;
                        }
                        newDoc.IsPathKnown = true;
                        CreatePageForExistingDocument(newDoc);
                        SelectDocPage(newDoc);
                        work = false;
                    }
                }
                else work = false;
            }
        }


        /// <summary>
        /// Удалить вкладку документа с компонента вкладок
        /// </summary>
        /// <param name="document">документ</param>
        private void RemoveDocumentPage(DocumentInfo document)
        {
            if (editorsPanel.TabPages.Contains(document.TabPage))
                editorsPanel.TabPages.Remove(document.TabPage);
        }


        /// <summary>
        /// Удалить текущий файл из проекта
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DelCurFile_Click(object sender, EventArgs e)
        {
            throw new NotImplementedException();
            /*if (editorsPanel.SelectedIndex == -1)
            {
                MessageBox.Show("Нет активной вкладки");
                return;
            }

            var doc = projectManager.GetDocByTabPage(editorsPanel.SelectedTab);
            editorsPanel.TabPages.Remove(doc.TabPage);
            projectManager.DeleteDocument(doc);*/
        }


        /// <summary>
        /// Инициализировать логгер
        /// </summary>
        private void InitializeLogger()
        {
            PathUtility.RestoreCurrentDirectory(Locality.ExeFile);
            logger = loggingManagment.GetLogger("MainIDElog");
            logger.WriteMessage(MessagePriority.Info, "Main log session has begun");
        }


        /// <summary>
        /// Обработчик на закрытие главного окна, т.е. завершение программы
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">FormClosedEventArgs</param>
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (projectManager.ProjectData != null)
                OnProjectClosed();
            runTimeManager.OnExit();
            loggingManagment.FlushToDisk();
            loggingManagment.Dispose();
            SerializationUtility.SerializeToFile<IDEConfig>(Properties.Settings.Default.ConfigPath, config);
            s.Close();
        }


        /// <summary>
        /// Обработчик перед закрытием главного окна, т.е. завершения программы
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">FormClosedEventArgs</param>
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!BeforeClosingQuery())
            {
                e.Cancel = true;
            }
        }


        /// <summary>
        /// Скомпилировать проект 
        /// </summary>
        /// <returns>
        /// данные комиляции
        /// </returns>
        private List<CompilationData> CompileProject()
        {
            errorList.ClearErrors();
            ErrorReport errorReport;
            List<CompilationData> compilationData = projectManager.CompileProject(out errorReport);
            ecoSpace.GetEcoService<IFunctionManager>().ClearLibrary();
            if (errorReport.Errors.Count != 0)
            {
                errorList.AddErrorReport(errorReport);
                tcAxiom_Errors.SelectTab(tpErrorList);
                MessageBox.Show("Компиляция не пройдена: имеются ошибки ", "Результат компиляции проекта", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                ecoSpace.GetEcoService<IFunctionManager>().ClearLibrary();
                return null;
            }
            else
            {
                MessageBox.Show("Компиляция прошла успешно: ошибок нет", "Результат компиляции проекта", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ecoSpace.GetEcoService<IFunctionManager>().ClearLibrary();
                return compilationData;
            }
            //когда пользователь запрашивает только компиляцию, то после неё мы должны почистить библиотеку
            
        }

        /// <summary>
        /// Скомпилировать проект (без вывода сообщения, если прошло успешно)
        /// </summary>
        /// <returns>
        /// данные комиляции
        /// </returns>
        private List<CompilationData> CompileProjectBeforeRun()
        {
            errorList.ClearErrors();
            ErrorReport errorReport;
            List<CompilationData> compilationData = projectManager.CompileProject(out errorReport);
            if (errorReport.Errors.Count != 0)
            {
                errorList.AddErrorReport(errorReport);
                tcAxiom_Errors.SelectTab(tpErrorList);
                MessageBox.Show("Компиляция не пройдена: имеются ошибки ", "Результат компиляции проекта", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null;
            }
            else
            {
                return compilationData;
            }
        }


        /// <summary>
        /// Обработчик нажатия на "Cкомпилировать проект"
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void CompileProject_Click(object sender, EventArgs e)
        {
            CompileProject();
        }


        /// <summary>
        /// Выполнить действия при выгрузке проекта
        /// </summary>
        private void OnProjectClosed()
        {
            if (commandListsForm != null)
            {

                this.pnlMain.Controls.Remove(commandListsForm.MainSplitContainer);
                this.Controls.Remove(commandListsForm.MainMenuStrip);

                commandListsForm.visualizationTarget = null;
                commandListsForm.Exit();
                commandListsForm.Dispose();
                commandListsForm = null;

            }

            editorsPanel.TabPages.Clear();
            plantControlExplorer.OnProjectClosed();
            projectManager.UnloadProject();
            runTimeManager.OnProjectUnloaded();
            errorList.ClearErrors();


            PathUtility.SetCurrentProjectPath(null);
        }


        /// <summary>
        /// Выполнить некоторые действия, необходимые после загрузки в систему нового проекта
        /// </summary>
        private void OnProjectLoaded()
        {
            loadingProject = true;

            if (projectManager.ProjectData.ProjectType == ProjectType.Usual)
            {
                ArrangeUsualComponents();
                fillPlantControlExplorer();
                projectManager.OnProjectLoaded();
                runTimeManager.OnProjectLoaded();
                SetMenuItemsEnabled();
                SetTabPages();
            }
            else if (projectManager.ProjectData.ProjectType == ProjectType.CommandList)
            {
                ArrangeCommandListViewComponents();
            }

            curProjectType = projectManager.ProjectData.ProjectType;
            loadingProject = false;
        }


        /// <summary>
        /// Создать новые вкладки для документов, у которых их еще нет, но не отображать их
        /// </summary>
        private void SetTabPages()
        {
            projectManager.ProjectData.GetAllDocuments().ForEach(doc => CreatePageForExistingDocument(doc));
        }


        private void ArrangeUsualComponents()
        {
            if (projectTypeView == ProjectType.CommandList)
            {
                this.pnlMain.Controls.Add(splitContainer1);
                tpAxiomControl.Controls.Add(this.MainAxiomWindow);
                this.Controls.Add(menuStripMain);
                this.MainMenuStrip = menuStripMain;
                menuStripMain.Items.Insert(2, viewToolStripMenuItem);

                splitContainer1.Show();
                menuStripMain.Show();

                this.Focus();
                projectTypeView = ProjectType.Usual;
            }
        }

        private void ArrangeCommandListViewComponents()
        {
            commandListsForm = new CommandLists.CommandListsForm(ecoSpace, loggingManagment, runTimeManager.Visualizator);
            commandListsForm.FileNameChangedEvent += new CommandLists.CommandListsForm.FileNameChangedHandler(commandListsForm_FileNameChangedEvent);
            commandListsForm.FileName = (string)projectManager.ProjectData.Tag.Object;

            if (projectTypeView == ProjectType.Usual)
            {
                menuStripMain.Hide();
                splitContainer1.Hide();
                this.Controls.Remove(menuStripMain);
                this.pnlMain.Controls.Remove(splitContainer1);
            }

            this.Controls.Add(commandListsForm.MainMenuStrip);

            ToolStripMenuItem item;
            item = new ToolStripMenuItem(newToolStripMenuItem.Text, newToolStripMenuItem.Image);
            item.ShowShortcutKeys = true;
            item.ShortcutKeys = newToolStripMenuItem.ShortcutKeys;
            item.Click += new EventHandler(this.CreateProject_Click);
            (commandListsForm.MainMenuStrip.Items[0] as ToolStripMenuItem).DropDownItems.Insert(0, item);

            item = new ToolStripMenuItem(openToolStripMenuItem.Text, openToolStripMenuItem.Image);
            item.ShowShortcutKeys = true;
            item.ShortcutKeys = openToolStripMenuItem.ShortcutKeys;
            item.Click += new EventHandler(this.LoadProject_Click);
            (commandListsForm.MainMenuStrip.Items[0] as ToolStripMenuItem).DropDownItems.Insert(1, item);

            item = new ToolStripMenuItem("Сохранить", saveAllStripMenuItem.Image);
            item.ShowShortcutKeys = true;
            item.ShortcutKeys = (Keys)Shortcut.CtrlS;
            item.Click += new EventHandler(this.SaveAll_Click);
            (commandListsForm.MainMenuStrip.Items[0] as ToolStripMenuItem).DropDownItems.Insert(6, item);

            item = new ToolStripMenuItem(exitToolStripMenuItem.Text, exitToolStripMenuItem.Image);
            item.ShowShortcutKeys = true;
            item.ShortcutKeys = exitToolStripMenuItem.ShortcutKeys;
            item.Click += new EventHandler(this.Exit_Click);
            (commandListsForm.MainMenuStrip.Items[0] as ToolStripMenuItem).DropDownItems.RemoveAt((commandListsForm.MainMenuStrip.Items[0] as ToolStripMenuItem).DropDownItems.Count - 1);
            (commandListsForm.MainMenuStrip.Items[0] as ToolStripMenuItem).DropDownItems.Add(item);

            item = new ToolStripMenuItem(helpToolStripMenuItem.Text, helpToolStripMenuItem.Image);
            var item2 = new ToolStripMenuItem(aboutToolStripMenuItem.Text, aboutToolStripMenuItem.Image);
            item2.Click += new EventHandler(this.About_Click);
            item.DropDownItems.Add(item2);
            commandListsForm.MainMenuStrip.Items.Add(item);

            commandListsForm.MainMenuStrip.Items.Insert(2, viewToolStripMenuItem);

            this.pnlMain.Controls.Add(commandListsForm.MainSplitContainer);
            this.MainMenuStrip = commandListsForm.MainMenuStrip;

            commandListsForm.MainSplitContainer.Panel2.Controls.Remove(commandListsForm.visualizationTarget);
            commandListsForm.visualizationTarget = this.MainAxiomWindow;
            commandListsForm.MainSplitContainer.Panel2.Controls.Add(this.MainAxiomWindow);

            projectTypeView = ProjectType.CommandList;
        }


        /// <summary>
        /// Обработчик нажатия на "Создать новый проект"
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void CreateProject_Click(object sender, EventArgs e)
        {
            // чтобы сохранить уже открытый проект
            if (!BeforeClosingQuery()) return;

            NewProjectDialog dialog = new NewProjectDialog(defaulUserProjectDirectory, defaulDomainModelsDirectory, loggingManagment);
            DialogResult res = dialog.ShowDialog();
            if (res != DialogResult.OK) return;

            OnProjectClosed();

            Directory.CreateDirectory(dialog.ProjectFolderPath);

            projectManager.CreateNewProject(dialog.ProjectType, dialog.ProjectName, dialog.ProjectFolderPath, dialog.DomainModelPath);

            OnProjectLoaded();

            string prjPath = Path.GetFullPath(dialog.ProjectFolderPath + dialog.ProjectName + ".ihprj");

            if (!config.resentProjects.Contains(prjPath))
                config.resentProjects.Add(prjPath);
            else
            {
                config.resentProjects.Remove(prjPath);
                config.resentProjects.Insert(0, prjPath);
            }
            UpdateRecentPrjList(false);
        }



        /// <summary>
        /// Загрузить проект
        /// </summary>
        /// <param name="FileName">путь до файла с проектом</param>
        /// 
        private void LoadProject(string fileName)
        {
            try
            {
                projectManager.LoadProject(fileName);
                OnProjectLoaded();
                if (projectManager.ProjectData.ProjectType == ProjectType.CommandList)
                    commandListsForm.LoadProgram((string)projectManager.ProjectData.Tag.Object);

                if (!config.resentProjects.Contains(fileName))
                    config.resentProjects.Add(fileName);
                else
                {
                    config.resentProjects.Remove(fileName);
                    config.resentProjects.Insert(0, fileName);
                }
            }
            catch (LoadingProjectException exception)
            {
                logger.WriteException(exception);
                ErrorsUtility.Error("Ошибка загрузки проекта. " + exception.Message, logger);
                OnProjectClosed();
                if (config.resentProjects.Contains(fileName))
                    config.resentProjects.Remove(fileName);
                return;
            }
            catch (LoadingDomainModelException exception)
            {
                logger.WriteException(exception);
                ErrorsUtility.Error("Ошибка загрузки описания оборудования. " + exception.Message, logger);
                OnProjectClosed();
                if (config.resentProjects.Contains(fileName))
                    config.resentProjects.Remove(fileName);
                return;
            }
            catch (LoadingDomainModelCorrespException exception)
            {
                logger.WriteException(exception);
                ErrorsUtility.Error("Ошибка совместимости с описанием оборудования. " + exception.Message, logger);
                OnProjectClosed();
                if (config.resentProjects.Contains(fileName))
                    config.resentProjects.Remove(fileName);
                return;
            }
            catch (LoadingDocumentException exception)
            {
                logger.WriteException(exception);
                ErrorsUtility.Error(exception.Message, logger);

                OnProjectLoaded();
                if (projectManager.ProjectData.ProjectType == ProjectType.CommandList)
                    commandListsForm.LoadProgram((string)projectManager.ProjectData.Tag.Object);
            }
            finally
            {
                UpdateRecentPrjList(true);
            }
        }


        /// <summary>
        /// Обработчик нажатия на "Открыть проект"
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void LoadProject_Click(object sender, EventArgs e)
        {
            if (!BeforeClosingQuery()) return;

            OpenFileDialog dial = new OpenFileDialog();

            dial.Title = "Открыть проект";
            dial.AddExtension = false;
            dial.CheckFileExists = true;
            dial.Multiselect = false;
            dial.SupportMultiDottedExtensions = false;
            dial.Filter = "Файл проекта (*.ihprj) | *.ihprj";
            dial.DefaultExt = "Файл проекта (*.ihprj) | *.ihprj";
            dial.InitialDirectory = Application.StartupPath + defaulUserProjectDirectory;
            dial.RestoreDirectory = true;
            DialogResult res = dial.ShowDialog();

            if (res != DialogResult.OK) return;

            Cursor.Current = Cursors.WaitCursor;

            OnProjectClosed();

            LoadProject(dial.FileName);

            Cursor.Current = Cursors.Default;
        }


        /// <summary>
        /// Создать для документа вкладку (но не отображать), если ее нет
        /// </summary>
        /// <param name="doc">документ</param>
        private void CreatePageForExistingDocument(DocumentInfo doc)
        {
            if (doc.TabPage == null)
            {
                TabPage tabPage = new TabPage(Path.GetFileNameWithoutExtension(doc.DocumentPath));

                Panel panel = new Panel();
                panel.Parent = tabPage;
                panel.Dock = DockStyle.Fill;
                panel.BorderStyle = BorderStyle.Fixed3D;
                panel.AutoScroll = true;
                tabPage.Controls.Add(panel);
                doc.TabPage = new EcoTabPage(ecoSpace, tabPage);


                (doc.Editor.Object as IDocumentEditor).Initialize(panel);
            }
        }


        /* DocumentNameChanged
        public void doc_NameChanged(Document sender)
        {
          pm.IsModified = true;
          fillThePlantControlExplorer();
        }
         */


        /// <summary>
        /// Сделать вкладку документа активной, если ее нет, то
        /// добавить ее на визуальный компонент с вкладками
        /// </summary>
        /// <param name="doc"></param>
        private void SelectDocPage(DocumentInfo doc)
        {
            if (!editorsPanel.Contains(doc.TabPage))
                editorsPanel.TabPages.Add(doc.TabPage);

            editorsPanel.SelectTab(doc.TabPage);
            doc.TabPage.Page.Select();
            (doc.Editor.Object as IDocumentEditor).OnSelect();
        }


        /// <summary>
        /// Обработчик нажатия на "О программе"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void About_Click(object sender, EventArgs e)
        {
            new IDEDialogs.AboutForm().ShowDialog(this);
        }



        /// <summary>
        /// Вызывается перед закрытием проекта
        /// </summary>
        /// <returns>Закрывать проект или нет</returns>
        private bool BeforeClosingQuery()
        {
            if (projectManager.ProjectData != null)
                if ((projectManager.ProjectData.ProjectType == ProjectType.CommandList) || ((projectManager.ProjectData.ProjectType == ProjectType.Usual) && (!projectManager.ProjectData.IsOneDocumentDirty())))
                    return true;
                else
                {
                    DialogResult q = MessageBox.Show("Сохранить проект и все его файлы перед закрытием?", "Проект был изменен", MessageBoxButtons.YesNoCancel);
                    if (q == DialogResult.Yes)
                    {
                        SaveAll_Click(null, null);
                        return true; // проект сохранили, его можно закрывать
                    }
                    else if (q == DialogResult.No)
                        return true; // проект отказались сохранить, его можно закрывать
                    else return false; // отказываются закрывать проект
                }
            return true;
        }


        /// <summary>
        /// Обновить содержимое PlantControlExplorer'а
        /// </summary>
        private void fillPlantControlExplorer()
        {
            plantControlExplorer.FillProjectTreeView(projectManager.ProjectData);
            if (projectManager.ProjectData != null)
            {
                plantControlExplorer.FillDomainModelTreeView(projectManager.ProjectData.DomainModel);
            }
        }


        /// <summary>
        /// Обработчик нажатия на выход
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void Exit_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        #region editorsPanel event handlers
        /// <summary>
        /// Обработчик на выделение вкладки
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void editorsPanel_Selected(object sender, TabControlEventArgs e)
        {
            SetMenuItemsEnabled();
            /*if (e.TabPage == null) return;

            Document doc = pm.CurrentProject.docs.Find(val => (val.Tabpage == e.TabPage));
            if (doc == null) return;
            doc.Editor.OnSelect();
            foreach (ToolStripItem item in doc.PluginMenuItems)
                menuStripMain.Items.Insert(2, item); 
             */
        }

        /// <summary>
        /// Обработчик на добавление новой вкладки
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">ControlEventArgs</param>
        private void editorsPanel_ControlAdded(object sender, ControlEventArgs e)
        {
            SetMenuItemsEnabled();
        }
        #endregion


        /// <summary>
        /// Сохранить документ
        /// </summary>
        /// <param name="document">документ</param>
        private void SaveDocument(DocumentInfo document)
        {
            if (!document.IsPathKnown)
                SaveAsDocument(document);
            else projectManager.SaveDocument(document);
        }


        /// <summary>
        /// Обработчик нажатия на "Cохраненить текущий документ"
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void SaveDocument_Click(object sender, EventArgs e)
        {
            if (editorsPanel.SelectedTab == null)
                return;

            DocumentInfo doc = projectManager.GetDocByTabPage(editorsPanel.SelectedTab);
            SaveDocument(doc);
        }

        /// <summary>
        /// Есть ли документ кроме данного со следующим путем
        /// </summary>
        /// <param name="document">документ</param>
        /// <param name="DocPath">новый путь</param>
        /// <returns>(bool)</returns>
        private bool DublicateDocName(DocumentInfo document, string newDocPath)
        {
            DocumentInfo DocOfTheSameName =
                    projectManager.ProjectData.GetAllDocuments().Find(d =>
                       ((Path.GetFileNameWithoutExtension(d.DocumentPath) == Path.GetFileNameWithoutExtension(newDocPath) && (d != document))));

            if (DocOfTheSameName != null)
                return true;
            else return false;
        }


        /// <summary>
        /// Cохранить документ как...
        /// </summary>
        /// <param name="document">документ</param>
        private void SaveAsDocument(DocumentInfo document)
        {
            SaveFileDialog dial = new SaveFileDialog();
            dial.AddExtension = true;
            dial.OverwritePrompt = true;
            dial.CheckFileExists = false;
            dial.CheckPathExists = true;
            dial.DefaultExt = document.DocumentType.Name + "(*." + document.DocumentType.Extension + ")| *." + document.DocumentType.Extension;
            dial.Filter = document.DocumentType.Name + "(*." + document.DocumentType.Extension + ")| *." + document.DocumentType.Extension;
            dial.SupportMultiDottedExtensions = false;
            dial.InitialDirectory = projectManager.ProjectDataPath;
            dial.FileName = Path.GetFileNameWithoutExtension(document.DocumentPath);
            dial.RestoreDirectory = true;

            bool work = true;
            while (work)
            {
                work = true;

                DialogResult res = dial.ShowDialog();
                if (res == DialogResult.OK)
                {
                    if (!DublicateDocName(document, dial.FileName))
                    {
                        projectManager.SaveAsDocument(document, PathUtility.MakePathLocal(dial.FileName, Locality.CurrentProjectDir));
                        work = false;
                    }
                    else
                        ErrorsUtility.Error("Дoкумент c именем " + Path.GetFileNameWithoutExtension(dial.FileName) + " уже есть в проекте. " +
                                            "Сохраните документ под другим именем.", logger);
                }
                else work = false;
            }
        }


        /// <summary>
        /// Обработчик нажатия на "Cохраненить текущий документ как..."
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void SaveAsDocument_Click(object sender, EventArgs e)
        {
            if (editorsPanel.SelectedTab == null)
                return;

            var doc = projectManager.GetDocByTabPage(editorsPanel.SelectedTab);

            SaveAsDocument(doc);

        }


        /// <summary>
        /// Обработчик нажатия на "Cохраненить все"
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void SaveAll_Click(object sender, EventArgs e)
        {
            if (projectManager.ProjectData.ProjectType == ProjectType.Usual)
            {
                projectManager.ProjectData.GetAllDocuments().ForEach(d => SaveDocument(d));
            }
            else if (projectManager.ProjectData.ProjectType == ProjectType.CommandList)
                commandListsForm.Save();
            projectManager.SaveProject();
        }


        /// <summary>
        /// Обработчик нажатия на "Закрыть текущую вкладку"
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void СloseTabPage_Click(object sender, EventArgs e)
        {
            if (editorsPanel.SelectedTab != null)
            {
                editorsPanel.SelectedTab.Hide();
                editorsPanel.TabPages.Remove(editorsPanel.SelectedTab);
            }
        }


        /// <summary>
        /// Обработчик нажатия на "Закрыть все вкладки"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void СloseAllTabPages_Click(object sender, EventArgs e)
        {
            foreach (TabPage page in editorsPanel.TabPages)
                page.Hide();
            editorsPanel.TabPages.Clear();
        }


        /// <summary>
        /// Чтобы фокус не оставался на сплиттере после его передвижения
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">SplitterEventArgs</param>
        private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
        {
            menuStripMain.Select();
        }


        /// <summary>
        /// Чтобы фокус не оставался на сплиттере после его передвижения
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">SplitterEventArgs</param>
        private void splitContainer5_SplitterMoved(object sender, SplitterEventArgs e)
        {
            menuStripMain.Select();
        }


        #region Full/Usual screen mode

        /// <summary>
        /// Осуществить пеереход на полноэкранный режим работы
        /// </summary>
        public void MakeFullScreen()
        {
            WindowState = FormWindowState.Maximized;
            FormBorderStyle = FormBorderStyle.None;
            splitContainer1.Panel1MinSize = 3;
            splitContainer1.SplitterDistance = 3;
            splitContainer1.IsSplitterFixed = true;
        }

        /// <summary>
        /// Осуществить переход на нормальноэкранный режим работы
        /// </summary>
        public void MakeUsualScreen()
        {
            WindowState = FormWindowState.Normal;
            FormBorderStyle = FormBorderStyle.Sizable;
            splitContainer1.Panel1MinSize = 260;
            splitContainer1.SplitterDistance = 267;
            splitContainer1.IsSplitterFixed = false;
        }

        /// <summary>
        /// Обработчик нажатия на переход на полноэкранный режим работы
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void fullScreenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            fullScreenToolStripMenuItem.Visible = false;
            fullScreenToolStripMenuItem.ShortcutKeys = Keys.None;
            usualSceenToolStripMenuItem.Visible = true;
            usualSceenToolStripMenuItem.ShortcutKeys = Keys.F11;

            MakeFullScreen();
        }

        /// <summary>
        /// Обработчик нажатия на переход на нормальноэкранный режим работы
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void usualSceenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            fullScreenToolStripMenuItem.Visible = true;
            usualSceenToolStripMenuItem.ShortcutKeys = Keys.None;
            usualSceenToolStripMenuItem.Visible = false;
            fullScreenToolStripMenuItem.ShortcutKeys = Keys.F11;


            MakeUsualScreen();
        }

        #endregion


        /// <summary>
        /// Обработчик на показ окна просмотра объекта
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void ObjectViewToolStripMenuItem_Click(object sender, EventArgs e)
        {
            splitContainer2.IsSplitterFixed = false;
            plantControlExplorer.pnlDmlTreeView2.Show();
        }

        /// <summary>
        /// Обработчик на показ окна свойств
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void PropertiesToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            plantControlExplorer.pnlProperties.Show();
        }

        /// <summary>
        /// Обработчик на показ окна просмотра проекта
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void ProjectViewToolStripMenuItem_Click(object sender, EventArgs e)
        {
            plantControlExplorer.pnlTabControl.Show();
        }

        /// <summary>
        /// Обработчик изменения типа установки
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void cbBenchType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if ((sender as ToolStripComboBox).SelectedIndex == 0)
                choosenBenchType = BenchType.Virtual;
            else if ((sender as ToolStripComboBox).SelectedIndex == 1)
                choosenBenchType = BenchType.Real;

            // чтобы курсок уходил с cbBenchType, когда на нем выбирают элемент
            menuStripMain.Select();
        }

        /// <summary>
        /// Обработчик нажатия на кнопку Play/pause
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void btnPlayPause_Click(object sender, EventArgs e)
        {
            if (state != StateType.Run)
                state = StateType.Run;
            else state = StateType.Pause;
        }

        /// <summary>
        /// Обработчик нажатия на кнопку Stop
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">EventArgs</param>
        private void btnStop_Click(object sender, EventArgs e)
        {
            state = StateType.Stop;
        }

        /// <summary>
        /// При перерисовке визуализации
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainAxiomWindow_Paint(object sender, PaintEventArgs e)
        {
            if (!loadingProject)
                if (runTimeManager.Visualizator != null)
                    runTimeManager.Visualizator.RenderFrame();

        }

        private void editorsPanel_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }
}

